//!
/**
 ***********************************************************************************************************
 * <RBInput Implementation>
 ***********************************************************************************************************
 * @file RBInput.cpp
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Precompiled Header
 ***********************************************************************************************************/
#include "RBMainPCH.h"

/***********************************************************************************************************
 * Includes
 ***********************************************************************************************************/
#include "RBInput.h"

/***********************************************************************************************************
 * Defines
 ***********************************************************************************************************/

/***********************************************************************************************************
 * Classes implementation
 ***********************************************************************************************************/


/***********************************************************************************************************
 *
 ***********************************************************************************************************/
RBInput::RBInput()
: m_mousePos(0,0)
, m_mousePreviousPos(0,0)
{
    Reset();
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
RBInput::~RBInput()
{

}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBInput::SetValue(KeyType eType, KeyState uiState)
{
    m_aStates[eType] = uiState;
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBInput::Reset()
{
    memset(m_aStates, 0, sizeof(m_aStates));
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBInput::SetValues(KeyState* pValues)
{
    memcpy_s(m_aStates, IK_COUNT*sizeof(KeyState), pValues, IK_COUNT*sizeof(KeyState));
}


/***********************************************************************************************************
 *
 ***********************************************************************************************************/
bool RBInput::IsDown(KeyType eType)
{
    return ((m_aStates[eType] & KS_DOWN) != 0);
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
bool RBInput::IsUp(KeyType eType)
{
    return !IsDown(eType);
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBInput::SetMousePos(const int2& delta)
{
    m_mousePos = delta;
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
int2 RBInput::GetMouseDelta() const
{
    return m_mousePos - m_mousePreviousPos;
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
bool RBInput::IsPressed(KeyType eType)
{
    return (IsDown(eType)) && (!(m_aPreviousStates[eType] & KS_DOWN));
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
bool RBInput::IsReleased(KeyType eType)
{
    return (IsUp(eType)) && (m_aPreviousStates[eType] & KS_DOWN);
}

/***********************************************************************************************************
 *
 ***********************************************************************************************************/
void RBInput::Update()
{
    memcpy_s(m_aPreviousStates, sizeof(m_aPreviousStates), m_aStates, sizeof(m_aStates));
    KeyState lb = m_aStates[IK_LBUTTON];
    KeyState mb = m_aStates[IK_MBUTTON];
    KeyState rb = m_aStates[IK_RBUTTON];
    //memset(m_aStates, 0, sizeof(m_aStates));
    m_aStates[IK_LBUTTON] = lb;
    m_aStates[IK_MBUTTON] = mb;
    m_aStates[IK_RBUTTON] = rb;

    m_mousePreviousPos = m_mousePos;
}

